package Visitor;

import Functii.Functie;
import FunctiiElementare.*;
import FunctiiTrigo.*;
import Operatori.*;
import Arbori.Nod;

public class ToStringVisitor extends Visitor {
	protected String s;

	public ToStringVisitor() {
		s = "";
	}

	public ToStringVisitor(String s) {
		this.s = s;
	}

	public String getS() {
		return s;
	}

	public void setS(String s) {
		this.s = s;
	}

	public void visit(Cat c) {
		vizitare(c);
	}

	public void visit(Constanta ct) {
		this.s = Double.toString(ct.getCt());
	}

	public void visit(Cos c) {
		vizitare(c);
	}

	public void visit(Ctg c) {
		vizitare(c);
	}

	public void visit(Exp c) {
		vizitare(c);
	}

	public void visit(Ln c) {
		vizitare(c);
	}

	public void visit(Log c) {
		vizitare(c);
	}

	public void visit(Minus m) {
		vizitare(m);
	}

	public void visit(Necunoscuta n) {
		this.s = "x";
	}

	public void visit(Nod n) {
		if (n.toString().contains("Plus"))
			visit((Plus) n);
		else if (n.toString().contains("Constanta"))
			visit((Constanta) n);
		else if (n.toString().contains("Necunoscuta"))
			visit((Necunoscuta) n);
		else if (n.toString().contains("Minus"))
			visit((Minus) n);
		else if (n.toString().contains("Cat"))
			visit((Cat) n);
		else if (n.toString().contains("Produs"))
			visit((Produs) n);
		else if (n.toString().contains("Putere"))
			visit((Putere) n);
		else if (n.toString().contains("Cos"))
			visit((Cos) n);
		else if (n.toString().contains("Sin"))
			visit((Sin) n);
		else if (n.toString().contains("Tg"))
			visit((Tg) n);
		else if (n.toString().contains("Ctg"))
			visit((Ctg) n);
		else if (n.toString().contains("Sqrt"))
			visit((Sqrt) n);
		else if (n.toString().contains("Ln"))
			visit((Ln) n);
		else if (n.toString().contains("Log"))
			visit((Log) n);
		else if (n.toString().contains("Exp"))
			visit((Exp) n);
	}

	public void visit(Plus p) {
		vizitare(p);
	}

	public void visit(Produs p) {
		vizitare(p);
	}

	public void visit(Sin s) {
		vizitare(s);
	}

	public void visit(Sqrt c) {
		vizitare(c);
	}

	public void visit(Tg c) {
		vizitare(c);
	}

	public void vizitare(Functie f) {
		if (f.getFStang() != null) {
			visit(f.getFStang());
			String s1 = this.s;
			s = f.concatTermeni(s1);
		}
	}

	public void vizitare(Operator o) {
		if (o.getFStang() != null && o.getFDrept() != null) {
			visit(o.getFStang());
			String s1 = this.s;
			visit(o.getFDrept());
			String s2 = this.s;
			s = o.concatTermeni(s1, s2);
		}
	}

}
